package com.nit.lab.controller.ship;

import com.alibaba.fastjson.JSONObject;

import com.nit.lab.dto.ship.ShipTrackDTO;
import com.nit.lab.dto.system.TokenDTO;
import com.nit.lab.dto.utils.OpResultDTO;
import com.nit.lab.dto.utils.TableReqDTO;
import com.nit.lab.dto.utils.TableRspDTO;
import com.nit.lab.dto.ship.ShipDTO;
import com.nit.lab.service.ship.ShipService;
import com.nit.lab.utils.HttpRequestReader;
import com.nit.lab.utils.JWTUtil;
import com.nit.lab.utils.Jpython;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;

@RestController
@RequestMapping(value = "/api/ship")
public class ShipController {

    @Resource
    private ShipService shipService;
    private final Logger logger = LoggerFactory.getLogger(ShipController.class);

    /**
     * @Description: 获取船舶列表
     * @Author: zmhh
     * @Date:2020/02/02
     */
    @RequestMapping(value = "/query", method = RequestMethod.POST)
    public TableRspDTO list4Table(@RequestHeader(name = "Access-Token") String token, @RequestBody TableReqDTO tableReqDTO) {
        TableRspDTO tableRspDTO = new TableRspDTO();
        try {
            TokenDTO tokenDTO = JWTUtil.verifyToken(token);
            tableRspDTO = shipService.list4Table(tableReqDTO);
        } catch (Exception e) {
            logger.error(e.toString());
        }
        return tableRspDTO;
    }

    /**
     * @Description: 获取未出港船舶列表
     * @Author: fyx
     * @Date:2020/02/20
     */
    @RequestMapping(value = "queryShip", method = RequestMethod.POST)
    public OpResultDTO queryShip(@RequestHeader(name = "Access-Token") String token) {
        OpResultDTO opResultDTO = new OpResultDTO();
        try {
            TokenDTO tokenDTO = JWTUtil.verifyToken(token);
            opResultDTO=shipService.queryShip();
        } catch (Exception e) {
            logger.error(e.toString());
        }
        return opResultDTO;
    }

    /**
     * @Description: 获取离开港口的船舶列表
     * @Author: zmhh
     * @Date:2020/02/02
     */
    @RequestMapping(value = "/queryLeave", method = RequestMethod.POST)
    public TableRspDTO list4LeaveTable(@RequestHeader(name = "Access-Token") String token, @RequestBody TableReqDTO tableReqDTO) {
        TableRspDTO tableRspDTO = new TableRspDTO();
        try {
            TokenDTO tokenDTO = JWTUtil.verifyToken(token);
            tableRspDTO = shipService.list4LeaveTable(tableReqDTO);
        } catch (Exception e) {
            logger.error(e.toString());
        }
        return tableRspDTO;
    }

    /**
     * @Description: 新增船舶记录
     * @Author: SN
     * @Date: 2019/01/31 11:02
     */
    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public OpResultDTO add(@RequestHeader(name = "Access-token") String token,@RequestBody ShipDTO shipDTO) {
        OpResultDTO opResult = new OpResultDTO();
        try {
            TokenDTO tokenDTO = JWTUtil.verifyToken(token);
            opResult.setMessage(shipService.add(shipDTO).toString());
        } catch (Exception e) {
            logger.error(e.toString());
            opResult.setMessage("error");
        }
        return opResult;
    }

    /**
     * @Description: 修改记录
     * @Author: zmh
     * @Date: 2019/01/31 11:02
     * RequestMapping是一个用来处理请求地址映射的注解，可用于类或方法上。用于类上，表示类中的所有响应请求的方法都是以该地址作为父路径。
     */
    @RequestMapping(value = "/update", method = RequestMethod.POST)
    public OpResultDTO update(@RequestHeader(name = "Access-Token") String token, @RequestBody ShipDTO shipDTO) {
        OpResultDTO opResult = new OpResultDTO();
        try {
            TokenDTO tokenDTO = JWTUtil.verifyToken(token);
            opResult.setMessage(shipService.update(shipDTO).toString());
        } catch (Exception e) {
            logger.error(e.toString());
            opResult.setMessage("error");
        }
        return opResult;
    }

    /**
     * @Description: 删除记录
     * @Author: zmh
     * @Date: 2019/01/31 11:02
     * RequestMapping是一个用来处理请求地址映射的注解，可用于类或方法上。用于类上，表示类中的所有响应请求的方法都是以该地址作为父路径。
     */
    @RequestMapping(value = "/remove", method = RequestMethod.POST)
    public OpResultDTO remove(HttpServletRequest request) {
        OpResultDTO opResult = new OpResultDTO();
        try {
            JSONObject jsonObject = HttpRequestReader.getJsonObject(request);
            String shipIds = jsonObject.getString("shipIds");
            opResult.setMessage(shipService.remove(shipIds).toString());
        } catch (Exception e) {
            logger.error(e.toString());
            opResult.setMessage("error");
        }
        return opResult;
    }

    /**
     * @Description: 船舶离港记录
     * @Author: zmh
     * @Date: 2019/01/31 11:02
     * RequestMapping是一个用来处理请求地址映射的注解，可用于类或方法上。用于类上，表示类中的所有响应请求的方法都是以该地址作为父路径。
     */
    @RequestMapping(value = "/leave", method = RequestMethod.POST)
    public OpResultDTO leave(@RequestHeader(name = "Access-Token") String token, @RequestBody ShipDTO shipDTO) {
        OpResultDTO opResult = new OpResultDTO();
        try {
            TokenDTO tokenDTO = JWTUtil.verifyToken(token);
            opResult.setMessage(shipService.leavePort(shipDTO).toString());
        } catch (Exception e) {
            logger.error(e.toString());
            opResult.setMessage("error");
        }
        return opResult;
    }

//    /**
//     * @Description: python接口
//     * @Author: zmh
//     * @Date: 2021/02/14 14:52
//     * HttpServletRequest对象代表客户端的请求，当客户端通过HTTP协议访问服务器时，HTTP请求头中的所有信息都封装在这个对象中，通过这个对象提供的方法，可以获得客户端请求的所有信息。
//     * RequestMapping是一个用来处理请求地址映射的注解，可用于类或方法上。用于类上，表示类中的所有响应请求的方法都是以该地址作为父路径。
//     */
//    @RequestMapping(value = "/pythonApi", method = RequestMethod.POST)
//    public OpResultDTO jPython(HttpServletRequest request,@RequestHeader(name = "Access-Token") String token,@RequestBody ShipTrackDTO shipTrackDTO) {
//        OpResultDTO opResult = new OpResultDTO();
//        try {
//            TokenDTO tokenDTO = JWTUtil.verifyToken(token);
//            JSONObject jsonObject = HttpRequestReader.getJsonObject(request);
//            TableReqDTO tableReqDTO = new TableReqDTO();
//            tableReqDTO.setQueryParam(jsonObject.getString("queryParam"));
//            Jpython jpython = new Jpython();
//            String mmsi = tableReqDTO.parseQueryParam("mmsiNumber");
//            Date beginTime = shipTrackDTO.getBeginTime();
//            Date endTime = shipTrackDTO.getEndTime();
//            String btime = String.valueOf(beginTime.getTime()/1000);
//            String etime = String.valueOf(endTime.getTime()/1000);
//            String res = jpython.pythonApi(mmsi,btime,etime);
//            opResult.setMessage(res);
//        } catch (Exception e) {
//            logger.error(e.toString());
//            opResult.setMessage("error");
//        }
//        return opResult;
//    }

}
